<?php
    namespace Utils;
    /**
     * Cette classe permettra de gérer tout les Pattern nécessaires à cet applicatif
     *
     * @author mpetrini
     */
    class Pattern {
        
        /**
        * Vérifie si a chaîne passée en paramètre est une Adresse IP V4 ou non
        * 
        * @author mpetrini 
        *
        * @param string $ip
        *
        * @return boolean 
        */
        public static function isAdresseIPV4($ip) {
            $pattern = "/^(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:[.](?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}$/";
            return self::test($pattern, $ip);
        }
        /**
        * Vérifie si a chaîne passée en paramètre est une Adresse IP V6 ou non (Compressé ou non)
        * 
        * @author mpetrini 
        *
        * @param string $ip
        *
        * @return boolean 
        */
        public static function isAdresseIPV6($ip) {
            if(self::test("/^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$/", $ip)) {
                return true;
            }
            return self::test("/^((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?)::((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?)$/", $ip);
        }
        /**
        * Vérifie si a chaîne passée en paramètre est de l'Hexadécimal
        * 
        * @author mpetrini 
        *
        * @param string $hexa
        *
        * @return boolean 
        */
        public static function isHexa($hexa) {
            return self::test("/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/", $hexa);
        }
        /**
        * Vérifie si a chaîne passée en paramètre est respecte le pattern
        * 
        * @author mpetrini 
        *
        * @param string $pattern
        * @param string $string
        *
        * @return boolean 
        */
        public static function test($pattern, $string) {
            return (Boolean)preg_match($pattern, $string);
        }
        /**
         * Vérifie si le champs entré est bien une date
         * 
         * @param mixed $date
         * 
         * @return boolean
         */
        public static function date($date) {
            if($date instanceof \DateTime) {
                return true;
            }
 
            $timezone = new \DateTimeZone('Europe/Paris');
            $formats = array('d/m/Y', 'd/m/y', 'Y-m-d');
            try {
                $retour = new \DateTime($date);
            }catch(\Exception $e) {
                $retour = NULL;
            }
            if(!$retour instanceof \DateTime) {
                $i = 0;
                while(!$retour instanceof \DateTime && isset($formats[$i])) {
                    $retour = \DateTime::createFromFormat($formats[$i], $date, $timezone);
                    $i++;
                }
            }
            return $retour instanceof \DateTime;
        }
    }
?>
